Remote widget and Live Activity updates PRO
Remote updates carry data to a previously authorized widget configuration or Live Activity. The receiving script defines the UI. Your app script or external server sends JSON state through Scripting's Remote Push service.
Ordinary notification keys and /push send alerts; they do not update widgets or Live Activities. This API uses separate target IDs and scoped sender credentials. APNs tokens are managed by native code and are never supplied by scripts.
How it works
- Connect Remote Push on the receiving device.
- Authorize a widget script or prepare a Live Activity renderer.
- Native code registers system tokens and returns a logical target ID.
- An app script or external server submits JSON state. The service sends the corresponding APNs signal.
The entry script can exit after setup. WidgetKit and ActivityKit control when the screen changes; APNs acceptance does not confirm display.
APIs
Widget updates require iOS 26 or later. Push-capable local activities require iOS 17; remote starts require iOS 17.2. Check capabilities on the receiving device.
Daily quota
Remote updates and notifications share the account's daily push quota (UTC). Queued deliveries reserve capacity; APNs acceptance consumes one delivery. Each receiving device counts separately. Coalesced widget signals count once, and internal retries do not double-charge. Definite failures and unsent cancellations release capacity. Uncertain sends remain pending for their delivery day. Ending without new state and revocation are free cleanup operations.
IDs, states and receipts
RemoteTarget.status is ready, pending, disabled (with optional reason), or notConfigured. Ready means registered for remote operations; it is not a delivery or screen-display confirmation. Ended/ending targets are disabled. Pausing does not end an Activity; resuming does not revive an ended instance. Revocation prevents old grants/callbacks from restoring authority. Explicit reauthorization creates a new scope.
A write returns { targetId, revision, stateCommitted, launchRequestId?, operation }. stateCommitted distinguishes durable business state from transport progress. Operation status is queued, dispatching, accepted, failed, unknown, superseded, cancelled or expired. Use RemotePush.getOperation(operationId) to query the invoking script's authorized operation. A later state-only update can supersede an older queued update; an end cancels pending updates.
